﻿// -------------------------------------------------------------------------
//    @FileName         :    NFBagPageInterfaceBase.h
//    @Author           :    gaoyi
//    @Date             :    2024/12/24
//    @Email            :    445267987@qq.com
//    @Module           :    NFBagPageInterfaceBase
//
// -------------------------------------------------------------------------

// --- 文件总结 ---------------------------------------------------------------
// `NFBagPageInterfaceBase` 基于 `NFBagPage` 的通用接口实现：
// - 将接口调用转发到具体 `NFBagPage` 实例
// - 在提交前后记录格子数变化，提供基础排序与 Equal 判定
// - 维护本次是否进行了 SetItem（IsSetWare）
// ---------------------------------------------------------------------------

#pragma once

#include "NFBagPageInterface.h"

class NFBagPage;

/**
 * @brief 背包页签接口基类实现
 * 基于 NFBagPage 的通用接口实现，将接口调用转发到具体 NFBagPage 实例
 */
class NFBagPageInterfaceBase : public NFBagPageInterface
{
public:
    /**
     * @brief 构造函数
     * @param pBagPage 背包页签指针
     */
    NFBagPageInterfaceBase(NFBagPage* pBagPage);

    /**
     * @brief 析构函数
     */
    virtual ~NFBagPageInterfaceBase();

public:
    /**
     * @brief 获取页签容量
     * @param iCapacity 输出容量
     * @return 0成功，非0失败
     */
    int GetCapacity(int& iCapacity) const override;
    
    /**
     * @brief 获取空格子数量
     * @param iEmptyGridNum 输出空格子数量
     * @return 0成功，非0失败
     */
    int GetEmptyGridNum(int& iEmptyGridNum) const override;
    
    /**
     * @brief 获取背包页签类型
     * @param iPageType 输出页签类型
     * @return 0成功，非0失败
     */
    int GetBagType(int& iPageType) const override;
    
    /**
     * @brief 检查指定格子是否为空
     * @param iGridIndex 格子索引
     * @param bIsEmpty 输出是否为空
     * @return 0成功，非0失败
     */
    int GetIsEmpty(int iGridIndex, bool& bIsEmpty) const override;
    
    /**
     * @brief 获取物品指针
     * @param iGridIndex 格子索引
     * @param pItem 输出物品指针
     * @return 0成功，非0失败
     */
    int GetItem(int iGridIndex, ::NFGridItem*& pItem) const override;
    
    /**
     * @brief 设置物品到指定格子
     * @param pBagPageOp 背包页签操作器
     * @param iGridIndex 格子索引
     * @param pItem 要设置的物品
     * @param bPreCheckFlag 是否为预检查模式
     * @return 0成功，非0失败
     */
    int SetItem(const ::NFBagPageOp* pBagPageOp, int iGridIndex, const ::NFGridItem* pItem, bool bPreCheckFlag) override;
    
    /**
     * @brief 是否设置过物品
     * @return true已设置过，false未设置过
     */
    bool IsSetWare() const override;
    
    /**
     * @brief 判断两个容器是否相等
     * @param pOther 另一个容器接口
     * @return true相等，false不相等
     */
    bool Equal(const ::NFBagPageInterface* pOther) const override;
    
    /**
     * @brief 提交前回调
     * @param bPreCheckFlag 是否为预检查模式
     * @return 0成功，非0失败
     */
    int OnCommitBefore(bool bPreCheckFlag = false) override;
    
    /**
     * @brief 提交后回调
     * @param pBagPageOp 背包页签操作器
     * @return 0成功，非0失败
     */
    int OnCommitAfter(const ::NFBagPageOp* pBagPageOp) override;
    
    /**
     * @brief 排序物品
     * @return 0成功，非0失败
     */
    int Sort() override;
public:
    /**
     * @brief 获取背包页签（一定存在，不用检测）
     * @return 背包页签指针
     */
    NFBagPage* GetBagPage() const { return m_pBagPage; }

protected:
    /** @brief 提交前的格子数量 */
    int m_iCommitBeforeGridNum;
    /** @brief 背包页签指针 */
    NFBagPage* m_pBagPage;
    /** @brief 是否设置过物品 */
    bool m_bIsSetWare;
};
